import time
from typing import Any

from sqlalchemy.exc import IntegrityError
from sqlmodel import SQLModel, Field, select, Session

import namecard
import namecardholder
import settings
from settings import auto_session


# 创建回收站名片夹对象
class NameCardHolderRecycle(SQLModel, table=True):
    __tablename__ = 'namecardholderrecycle'

    # 定义类的属性，表示名片夹的各个字段
    holder_id:  int = Field(primary_key=True, nullable=False, foreign_key="namecardholder.id", ondelete="CASCADE")
    recycletime: int

    def __init__(self, holder_id: int):
        """
        初始化 NameCardHolderRecycle 对象，传入各个属性值并进行赋值。

        参数:
            holder(int):名片夹号
        """
        super().__init__(holder_id=holder_id, recycletime=int(time.time()))

    def to_dict(self) -> dict:
        """
        将 NameCardHolderRecycle 对象转换为字典形式，以便于数据传输和存储。

        返回:
            dict: 返回一个包含名片夹所有信息的字典
        """
        return self.model_dump()

@auto_session
def insert_1_namecardholderrecycle(holder_id: int,session: Session = None) -> int | None:
    """
    将单个名片夹添加到回收站。

    参数:
        user_id (int): 用户ID。
        holder_id (int): 名片夹ID。

    返回:
        int | None: 成功时返回新插入的ID，失败时返回None。
    """
    namecardholder.recycle_1_holder(holder_id = holder_id, session=session)
    namecardholderrecycle = NameCardHolderRecycle(holder_id=holder_id)
    session.add(namecardholderrecycle)
    try:
        session.commit()
        return namecardholderrecycle.holder_id
    except IntegrityError as e:
        session.rollback()
        print(f"插入数据时出错: {e}")
        return None

@auto_session
def restore_1_namecardholderrecycle(holder_id: int, session: Session = None) -> int | None:
    """
    将单个名片夹从回收站恢复。

    参数:
        user_id (int): 用户ID。
        holder_id (int): 名片夹ID。

    返回:
        int | None: 成功时返回0，失败时返回None。
    """
    namecardholder.restore_1_holder(holder_id=holder_id, session=session)
    namecardholderrecycle = session.get(NameCardHolderRecycle, holder_id)
    session.delete(namecardholderrecycle)
    try:
        session.commit()
        return 0
    except IntegrityError as e:
        session.rollback()
        print(f"删除数据时出错: {e}")
        return None


# 根据用户ID查询所有回收站名片夹信息
@auto_session
def search_all_recycle_holder(user_id: int, session:Session = None) -> list[dict[str, Any]] | None:
    """
    根据用户ID查询所有回收站名片夹信息。

    参数:
        user_id (int): 用户ID。

    返回:
        list[dict[str, Any]] | None: 名片夹信息列表，或None表示查询失败。
    """
    holders = namecardholder.search_all_holder(user_id=user_id, isinrecycle=True, session=session)

    for i in range(len(holders)):
        recycle = session.get(NameCardHolderRecycle, holders[i]['id'])
        holders[i] = holders[i] | recycle.to_dict()
        holders[i]['cardnumber'] = namecard.count_namecard_in_holder(holder_id=holders[i]['id'], isinrecycle=False,
                                                                     session=session)
    return holders
# print(search_all_recycle_holder(10))